package de.bw.jeans.alarminfo;

import java.util.ArrayList;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;

import de.bw.jeans.alarminfo.datatypes.Alarmdaten;
import de.bw.jeans.alarminfo.tools.LeseIlsAlarme;
import de.bw.jeans.alarminfo.tools.XmlFileTools;

public class StartActivity extends Activity {

	private ProgressBar progressInfo;
	private TextView tvProgress;
	ArrayList<Alarmdaten> alarmDaten = new ArrayList<Alarmdaten>();
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_start);
				
		progressInfo = (ProgressBar) findViewById(R.id.progressBar2);
		progressInfo.setMax(100);
		
		tvProgress = (TextView) findViewById(R.id.textView6);
		tvProgress.setText("");	
		
		alarmDaten = XmlFileTools.readAlertXmlFile(this);
		
		new DownloadAlarmInfo().execute();
	}

	protected void onResume() {
		super.onResume();

		int isGooglePlayServiceOk = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
		if(isGooglePlayServiceOk != ConnectionResult.SUCCESS) {
			if(isGooglePlayServiceOk == ConnectionResult.SERVICE_MISSING) {
				Log.d("AlarmInfo", "Google Play Services sind nicht insatlliert!");
				Dialog dialog = GooglePlayServicesUtil.getErrorDialog(isGooglePlayServiceOk, this, 1);
				dialog.show();
			}
			if(isGooglePlayServiceOk == ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED) {
				Log.d("AlarmInfo", "Google Play Services benötigen einen Update!");
				Dialog dialog = GooglePlayServicesUtil.getErrorDialog(isGooglePlayServiceOk, this, 1);
				dialog.show();
			}
			if(isGooglePlayServiceOk == ConnectionResult.SERVICE_DISABLED) {
				Log.d("AlarmInfo", "Google Play Services sind ausgeschaltet!");
				Dialog dialog = GooglePlayServicesUtil.getErrorDialog(isGooglePlayServiceOk, this, 1);
				dialog.show();
			}
			if(isGooglePlayServiceOk == ConnectionResult.SERVICE_INVALID) {
				Log.d("AlarmInfo", "Google Play Services ist ungültig!");
				Dialog dialog = GooglePlayServicesUtil.getErrorDialog(isGooglePlayServiceOk, this, 1);
				dialog.show();
			}
		}
		else {
			Log.d("AlarmInfo", "Google Play Services sind OK!");
		}

	}
	
	protected void updateInfoText(int prozWert) {
		progressInfo.setProgress(prozWert);
		tvProgress.setText("(" + prozWert + "% abgeschlossen...)");
	}
	
	protected void callNextScreen(ArrayList<Alarmdaten> serverAlarmDaten) {
		if(serverAlarmDaten.isEmpty()) {
			// Es wurden keine Alarme gefunden bzw. es konnten keine geladen werden...
			AlertDialog.Builder builder = new AlertDialog.Builder(this);
			builder.setMessage("Leider konnten keine Daten vom Server gelesen werden...");
			builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					// Die Anwendung beenden
					finish();
				}
			});
			
			AlertDialog dialog = builder.create();
			dialog.show();
		}
		else {
			// Das XML-File mit den ermittelten Daten erzeugen
			XmlFileTools.writeAlertXmlFile(serverAlarmDaten, this);
			
			// Den Schirm mit den ermittelten Daten anzeigen
			Intent intent = new Intent(this.getApplicationContext(), ShowAlertListActivity.class);
			startActivity(intent);			
		}
	}
	
	// Bereitstellen der Unterklasse f�r den Download der Alarmdaten
	private class DownloadAlarmInfo extends AsyncTask<Void, Void, Void> {

		private int anzahlAlarme = 0;
		private int anzahlProgressUpdates = 0;
		ArrayList<Alarmdaten> serverAlarmdaten = new ArrayList<Alarmdaten>();
		
		@Override
	    protected void onProgressUpdate(Void... progress) {
			anzahlProgressUpdates++;
			
	         // Den prozentualen Wert des Durchlaufs ermitteln
			int prozFertig = (int) Math.ceil((100 * anzahlProgressUpdates) / anzahlAlarme);
			updateInfoText(prozFertig);
	    }

		@Override
	    protected void onPostExecute(Void result) {
			// Weiter in der Oberklasse 
			callNextScreen(serverAlarmdaten);
	    }

		@Override
		protected Void doInBackground(Void... params) {
			
			try {
				// Die ID's der letzten 5 Alarme der Feuerwehr einlesen
				String[] alarmdatenIds = LeseIlsAlarme.getLast5AlertIds();
				anzahlAlarme = alarmdatenIds.length;
				
				// Die ID's der Alarmdaten im XML-File einlesen
				ArrayList<String> alarmDatenIds = new ArrayList<String>();
				for(int i=0; i<alarmDaten.size(); i++) {
					alarmDatenIds.add(alarmDaten.get(i).getAlarmId());
				}
				
				// Prüfen, ob die Werte identisch sind... (nur bei unterschiedlichen Werte soll neu geladen werden!)
				int anzahlTreffer = 0;
				for(int i=0; i<anzahlAlarme; i++) {
					if(alarmDatenIds.contains(alarmdatenIds[i]))
						anzahlTreffer++;
				}
				
				// Die Werte ggf. neu vom Server einlesen
				if(anzahlTreffer != anzahlAlarme) {
					for(int i=0; i<anzahlAlarme; i++) {
						serverAlarmdaten.add(LeseIlsAlarme.getAlertById(Integer.valueOf(alarmdatenIds[i])));
						publishProgress();
					}
				}
				else {
					serverAlarmdaten = alarmDaten;
				}
			}
			catch (Exception ex) {
				Log.d("AlarmInfo", "Fehler beim ermitteln der Alarmdaten! (" + ex.getMessage() + ")");
			}
			
			return null;
		}
	}
}
